package com.czx;

import com.czx.interceptor.IndexMethodInterceptor;
import com.czx.service.impl.IndexServiceImpl$$EnhancerByCGLIB$$9ff22e8e;

public class Test {
    public static void main(String[] args) {
        // cglib动态代理实现原理：底层通过asm字节码技术生成代理类，继承目标类形式
        // 1.调用代理类方法时，若无拦截则直接调用父类，否则进行拦截调用MethodInterceptor.intercept()方法执行代理逻辑，
        // 2.通过代理类方法名+参数类型得到签名计算出hash值，根据hash值获取代理类的FastClass对象中代理方法对应的索引 getIndex(Signature signature)
        // 3.通过索引找到代理类中的方法进行调用，invoke(int i, Object obj, Object[] objArr)
        // 4.代理类中的方法则调用父类方法完成目标方法调用
//        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "F:\\code");
//        Enhancer enhancer = new Enhancer();
//        enhancer.setSuperclass(IndexServiceImpl.class);
//        enhancer.setCallback(new IndexMethodInterceptor());
//        IndexService indexService = (IndexService) enhancer.create();
        IndexServiceImpl$$EnhancerByCGLIB$$9ff22e8e indexService = new IndexServiceImpl$$EnhancerByCGLIB$$9ff22e8e();
        indexService.setCallbacks(new IndexMethodInterceptor());
        indexService.show();
//        indexService.show("s", 1);
//        System.out.println(indexService.m());
//        System.out.println(indexService.m(1, 5));
    }
}
